# 文件名：serializers.py
# 作者：系统自动生成
# 创建日期：2025-04-26
# 描述：学生管理应用的序列化器文件，用于定义学生信息、考勤、成绩等数据的序列化方式

from rest_framework import serializers
from .models import Student, Attendance, Grade, LeaveApplication
from django.contrib.auth import get_user_model

class LeaveApplicationSerializer(serializers.ModelSerializer):
    """
    请假申请序列化器
    
    功能：
        - 处理请假申请的创建、更新和查询
        - 自动计算请假时长
        - 验证请假日期和联系信息
    
    字段说明：
        id - 请假申请ID (自动生成)
        student - 关联的学生ID (必填)
        student_name - 学生姓名(只读,自动从关联学生获取)
        applicant - 申请人ID (必填)
        applicant_name - 申请人姓名(只读,自动从用户表获取)
        start_date - 请假开始日期 (必填,格式:YYYY-MM-DD)
        end_date - 请假结束日期 (必填,格式:YYYY-MM-DD)
        reason - 请假原因 (必填,最大长度500字符)
        duration - 请假时长(天,自动计算)
        contact_person - 对接人姓名 (必填,最大长度50字符)
        contact_phone - 对接人电话 (必填,格式验证)
        proof_material - 证明材料URL(只读,文件上传后自动生成)
        status - 审批状态 (pending/approved/rejected)
        approver - 审批人ID (可选)
        approver_name - 审批人姓名(只读,自动从用户表获取)
        approved_at - 审批时间(只读,自动记录)
        remark - 备注 (可选,最大长度500字符)
    
    验证规则：
        - 开始日期必须早于或等于结束日期
        - 请假时长不能超过30天
        - 联系电话必须符合中国手机号格式
        - 证明材料大小不超过5MB
    
    示例请求：
        {
            "student": 1,
            "applicant": 2,
            "start_date": "2025-05-10",
            "end_date": "2025-05-12",
            "reason": "家庭事务",
            "contact_person": "张三",
            "contact_phone": "13800138000"
        }
    
    示例响应：
        {
            "id": 1,
            "student": 1,
            "student_name": "李四",
            "applicant": 2,
            "applicant_name": "王老师",
            "start_date": "2025-05-10",
            "end_date": "2025-05-12",
            "reason": "家庭事务",
            "duration": 3,
            "contact_person": "张三",
            "contact_phone": "13800138000",
            "status": "pending",
            "approved_at": null,
            "remark": null
        }
    """
    student_name = serializers.CharField(source='student.name', read_only=True)
    applicant_name = serializers.CharField(source='applicant.username', read_only=True)
    approver_name = serializers.CharField(source='approver.username', read_only=True)
    proof_material = serializers.FileField(read_only=True)
    
    class Meta:
        model = LeaveApplication
        fields = '__all__'
        extra_kwargs = {
            'student': {'required': True},
            'applicant': {'required': True},
            'start_date': {
                'required': True,
                'help_text': '请假开始日期，格式:YYYY-MM-DD'
            },
            'end_date': {
                'required': True,
                'help_text': '请假结束日期，格式:YYYY-MM-DD'
            },
            'reason': {
                'required': True,
                'max_length': 500,
                'help_text': '请假原因，最大长度500字符'
            },
            'duration': {
                'required': True,
                'min_value': 1,
                'max_value': 30,
                'help_text': '请假时长(天)，范围1-30天'
            },
            'contact_person': {
                'required': True,
                'max_length': 50,
                'help_text': '对接人姓名，最大长度50字符'
            },
            'contact_phone': {
                'required': True,
                'help_text': '对接人电话，格式:11位手机号'
            },
        }
    
    def validate(self, data):
        """
        验证请假申请数据
        """
        if data['start_date'] > data['end_date']:
            raise serializers.ValidationError("请假结束日期不能早于开始日期")
        
        data['duration'] = (data['end_date'] - data['start_date']).days + 1
        return data

class StudentSerializer(serializers.ModelSerializer):
    """
    学生信息序列化器
    
    功能：
        - 定义学生模型的序列化字段
        - 处理学生信息的创建和更新
    """
    class Meta:
        model = Student
        fields = '__all__'
        extra_kwargs = {
            'user': {'read_only': True},
        }

class AttendanceSerializer(serializers.ModelSerializer):
    """
    学生考勤序列化器
    
    功能：
        - 定义考勤模型的序列化字段
        - 处理考勤记录的创建和更新
    """
    class Meta:
        model = Attendance
        fields = '__all__'

class GradeSerializer(serializers.ModelSerializer):
    """
    学生成绩序列化器
    
    功能：
        - 定义成绩模型的序列化字段
        - 处理成绩记录的创建和更新
    """
    class Meta:
        model = Grade
        fields = '__all__'